package modelo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Casillero {

	private final int x;
	private final int y;	
	private List<Posicionable> contenido;

	public Casillero(int x, int y) {		
		this.x = x;
		this.y = y;
		this.contenido = new ArrayList<Posicionable>();
	}

	public boolean estaVacio() {
		
		return this.contenido.isEmpty();
	}

	public void ponerContenido(Posicionable objeto) {
		this.contenido.add(objeto);		
	}
	
	public boolean quitarContenido(Posicionable objeto) {
		return this.contenido.remove(objeto);
	}
	
	public Posicionable contenidoVerUltimo() {
		if (!this.contenido.isEmpty())
			return this.contenido.get(this.contenido.size()-1);
		return null;
	}
	
	public boolean contiene(Posicionable objeto) {
		return this.contenido.contains(objeto);
	}
	
	public boolean contieneNave() {
		Iterator<Posicionable> iterador = this.iteradorDeContenido();
		while (iterador.hasNext()) {
			if (iterador.next().esNave())  {
				return true;
			}
		}
		return false;
	}
	
	public boolean esAdyacente(Casillero otroCasillero) {
	
		return (this.distancia(otroCasillero) <= 1);
	}	
	
	public Iterator<Posicionable> iteradorDeContenido() {
		return this.contenido.iterator();
	}
	
	public List<Posicionable> getContenido() {
		return this.contenido;
	}

	public int getX() {
		return this.x;
	}

	public int getY() {
		return this.y;
	}
	
	
	public int distanciaEnX(Casillero otroCasillero) {
		
		return Math.abs(this.x - otroCasillero.getX());
	}
	
	public int distanciaEnY(Casillero otroCasillero) {
		
		return Math.abs(this.y - otroCasillero.getY());
	}
	
	public int distancia(Casillero otroCasillero) {
		
		return Math.max(this.distanciaEnX(otroCasillero), this.distanciaEnY(otroCasillero));
	}
	
	public ArrayList<Casillero> casillerosAdyacentes() {
		ArrayList<Casillero> casilleros = new ArrayList<Casillero>();		
		
		for (int i = -1; i <= 1; i++)
			for (int j = -1; j <= 1; j++)
				if (i != 0 || j != 0){
					Casillero casillero = Tablero.getInstancia().getCasillero(
							this.getX() + i, this.getY() + j);
					if (casillero != null)
						casilleros.add(casillero);
				}
		
		return casilleros;
	}
	
	public void recibirExplosion(MinaConRetardo mina, int intensidad , ArrayList<Casillero> casillerosImpactados) {
		
		if (!casillerosImpactados.contains(this)) {
			mina.efectuarSobre(this);
			casillerosImpactados.add(this);
			if (intensidad > 1) {
				Iterator<Casillero> iteradorDeCasilleros = this.casillerosAdyacentes().iterator();
				while (iteradorDeCasilleros.hasNext()) {
					iteradorDeCasilleros.next().recibirExplosion(mina, intensidad-1, casillerosImpactados);
				}
			}
		}

	}
}

